package com.mbengue.corp.apr.ra.dao.impl;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;
import org.hibernate.criterion.Restrictions;

import com.mbengue.corp.apr.ra.core.Article;
import com.mbengue.corp.apr.ra.core.ArticleMembre;
import com.mbengue.corp.apr.ra.core.Membre;
import com.mbengue.corp.apr.ra.dao.ArticleMembreDao;
import com.mbengue.corp.apr.ra.util.HibernateUtil;

public class ArticleMembreDaoImpl implements ArticleMembreDao {
  private static final long serialVersionUID = 1L;
  private Session session;

  public ArticleMembreDaoImpl() {
    session = HibernateUtil.getSessionFactory();
  }

  @Override
  public void ajouter(ArticleMembre aObjet) throws HibernateException {
    Transaction transaction = session.beginTransaction();
    try {
      session.save(aObjet);
      transaction.commit();
    } catch (Exception e) {
      transaction.rollback();
      throw new HibernateException(e);
    } finally {
      session.flush();
      //session.close();
    }
  }

  @Override
  public ArticleMembre modifier(ArticleMembre aObjet) throws HibernateException {
    // TODO Auto-generated method stub
    return null;
  }

  @Override
  public void supprimer(ArticleMembre aObjet) throws HibernateException {
    Transaction tra = session.beginTransaction();
    session.delete(aObjet);
    tra.commit();
  }

  @Override
  public ArticleMembre trouver(Long aKey) throws HibernateException {
    Criteria criteria = session.createCriteria(ArticleMembre.class);
    criteria.add(Restrictions.idEq(aKey));
    return (ArticleMembre) criteria.uniqueResult();
  }

  @SuppressWarnings("unchecked")
  @Override
  public List<ArticleMembre> trouverArticleMembre(Membre membre) {
    Query query = session.getNamedQuery("findByAuteur");
    query.setParameter("auteur", membre);
    return query.list();
  }

  @Override
  public boolean supprimerArticleMembre(Article article) {
    try {
      Criteria criteria = session.createCriteria(ArticleMembre.class);
      criteria.add(Restrictions.eq("article", article));
      ArticleMembre am = (ArticleMembre) criteria.uniqueResult();
      supprimer(am);
      return true;
    } catch (Exception e) {
      e.printStackTrace();
      return false;
    }
  }

  @Override
  public boolean supprimerArticleMembre(Membre aMembre) {
    try {
      Query query = session.getNamedQuery("deleteByAuteur");
      query.setParameter("auteur", aMembre);
      query.executeUpdate();
      return true;
    } catch (HibernateException he) {
      he.printStackTrace();
      return false;
    }
  }
}
